/**
 * Copyright (C) 2010 Cloudfarming <info@cloudfarming.nl>
 *
 * Licensed under the Eclipse Public License - v 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.eclipse.org/legal/epl-v10.html
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package nl.cloudfarming.client.model;

import java.beans.*;
import org.openide.util.NbBundle;

/**
 * Beaninfo for plot properties
 *
 * @author Gerben Feenstra
 */
public class FieldBeanInfo extends SimpleBeanInfo {

    // Bean descriptor//GEN-FIRST:BeanDescriptor
    /*lazy BeanDescriptor*/
    private static BeanDescriptor getBdescriptor(){
        BeanDescriptor beanDescriptor = new BeanDescriptor  ( nl.cloudfarming.client.model.Field.class , null ); // NOI18N//GEN-HEADEREND:BeanDescriptor

    // Here you can add code for customizing the BeanDescriptor.

        return beanDescriptor;     }//GEN-LAST:BeanDescriptor

    // These will not determine the order as of yet: http://netbeans.org/bugzilla/show_bug.cgi?id=55742

    // Property identifiers//GEN-FIRST:Properties
    private static final int PROPERTY_acreage = 0;
    private static final int PROPERTY_endDate = 1;
    private static final int PROPERTY_id = 2;
    private static final int PROPERTY_name = 3;
    private static final int PROPERTY_startDate = 4;
    private static final int PROPERTY_WKT = 5;

    // Property array 
    /*lazy PropertyDescriptor*/
    private static PropertyDescriptor[] getPdescriptor(){
        PropertyDescriptor[] properties = new PropertyDescriptor[6];
    
        try {
            properties[PROPERTY_acreage] = new PropertyDescriptor ( "acreage", nl.cloudfarming.client.model.Field.class, "getAcreage", null ); // NOI18N
            properties[PROPERTY_acreage].setDisplayName ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.displayname.acreage") );
            properties[PROPERTY_acreage].setShortDescription ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.shortdescription.acreage") );
            properties[PROPERTY_acreage].setBound ( true );
            properties[PROPERTY_endDate] = new PropertyDescriptor ( "endDate", nl.cloudfarming.client.model.Field.class, "getEndDate", "setEndDate" ); // NOI18N
            properties[PROPERTY_endDate].setDisplayName ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.displayname.enddate") );
            properties[PROPERTY_endDate].setShortDescription ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.shortdescription.enddate") );
            properties[PROPERTY_endDate].setBound ( true );
            properties[PROPERTY_endDate].setPropertyEditorClass ( DatePropertyEditor.class );
            properties[PROPERTY_id] = new PropertyDescriptor ( "id", nl.cloudfarming.client.model.Field.class, "getId", null ); // NOI18N
            properties[PROPERTY_id].setDisplayName ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.common.displayname.id") );
            properties[PROPERTY_id].setShortDescription ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.shortdescription.id") );
            properties[PROPERTY_id].setBound ( true );
            properties[PROPERTY_name] = new PropertyDescriptor ( "name", nl.cloudfarming.client.model.Field.class, "getName", "setName" ); // NOI18N
            properties[PROPERTY_name].setDisplayName ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.common.displayname.name") );
            properties[PROPERTY_name].setShortDescription ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.shortdescription.name") );
            properties[PROPERTY_name].setBound ( true );
            properties[PROPERTY_startDate] = new PropertyDescriptor ( "startDate", nl.cloudfarming.client.model.Field.class, "getStartDate", "setStartDate" ); // NOI18N
            properties[PROPERTY_startDate].setDisplayName ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.displayname.startdate") );
            properties[PROPERTY_startDate].setShortDescription ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.shortdescription.startdate") );
            properties[PROPERTY_startDate].setBound ( true );
            properties[PROPERTY_startDate].setPropertyEditorClass ( DatePropertyEditor.class );
            properties[PROPERTY_WKT] = new PropertyDescriptor ( "WKT", nl.cloudfarming.client.model.Field.class, "getWKT", null ); // NOI18N
            properties[PROPERTY_WKT].setDisplayName ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.displayname.wkt") );
            properties[PROPERTY_WKT].setShortDescription ( NbBundle.getMessage(FieldBeanInfo.class,"beaninfo.field.shortdescription.wkt") );
            properties[PROPERTY_WKT].setBound ( true );
        }
        catch(IntrospectionException e) {
            e.printStackTrace();
        }//GEN-HEADEREND:Properties


        // Here you can add code for customizing the properties array.

        // Registered PropertyEditorClass on the properties of type Date
        // Alternative is registering this editor for all properties of type java.util.Date globally with
        // PropertyEditorManager.registerEditor(Date.class, DatePropertyEditor.class);

        return properties;     }//GEN-LAST:Properties

    // EventSet identifiers//GEN-FIRST:Events
    private static final int EVENT_propertyChangeListener = 0;

    // EventSet array
    /*lazy EventSetDescriptor*/
    private static EventSetDescriptor[] getEdescriptor(){
        EventSetDescriptor[] eventSets = new EventSetDescriptor[1];
    
        try {
            eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( nl.cloudfarming.client.model.Field.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[] {"propertyChange"}, "addPropertyChangeListener", "removePropertyChangeListener" ); // NOI18N
        }
        catch(IntrospectionException e) {
            e.printStackTrace();
        }//GEN-HEADEREND:Events
//        try {
//            //eventSets[1] = new EventSetDescriptor(nl.cloudfarming.client.model.Plot.class, "undoableEditListener", javax.swing.event.UndoableEditListener.class, new String[]{"undoableEditHappened"}, "addUndoableEditListener", "removeUndoableEditListener");
//            // Here you can add code for customizing the event sets array.
//        } catch (IntrospectionException ex) {
//            Exceptions.printStackTrace(ex);
//        }
    // Here you can add code for customizing the event sets array.

        return eventSets;     }//GEN-LAST:Events

    // Method identifiers//GEN-FIRST:Methods
    private static final int METHOD_equals0 = 0;
    private static final int METHOD_hashCode1 = 1;

    // Method array 
    /*lazy MethodDescriptor*/
    private static MethodDescriptor[] getMdescriptor(){
        MethodDescriptor[] methods = new MethodDescriptor[2];
    
        try {
            methods[METHOD_equals0] = new MethodDescriptor(nl.cloudfarming.client.model.Field.class.getMethod("equals", new Class[] {java.lang.Object.class})); // NOI18N
            methods[METHOD_equals0].setDisplayName ( "" );
            methods[METHOD_hashCode1] = new MethodDescriptor(nl.cloudfarming.client.model.Field.class.getMethod("hashCode", new Class[] {})); // NOI18N
            methods[METHOD_hashCode1].setDisplayName ( "" );
        }
        catch( Exception e) {}//GEN-HEADEREND:Methods

    // Here you can add code for customizing the methods array.
    
        return methods;     }//GEN-LAST:Methods

    private static java.awt.Image iconColor16 = null;//GEN-BEGIN:IconsDef
    private static java.awt.Image iconColor32 = null;
    private static java.awt.Image iconMono16 = null;
    private static java.awt.Image iconMono32 = null;//GEN-END:IconsDef
    private static String iconNameC16 = null;//GEN-BEGIN:Icons
    private static String iconNameC32 = null;
    private static String iconNameM16 = null;
    private static String iconNameM32 = null;//GEN-END:Icons

    private static final int defaultPropertyIndex = -1;//GEN-BEGIN:Idx
    private static final int defaultEventIndex = -1;//GEN-END:Idx

    
//GEN-FIRST:Superclass

    // Here you can add code for customizing the Superclass BeanInfo.

//GEN-LAST:Superclass
	
    /**
     * Gets the bean's <code>BeanDescriptor</code>s.
     * 
     * @return BeanDescriptor describing the editable
     * properties of this bean.  May return null if the
     * information should be obtained by automatic analysis.
     */
    @Override
    public BeanDescriptor getBeanDescriptor() {
	return getBdescriptor();
    }

    /**
     * Gets the bean's <code>PropertyDescriptor</code>s.
     * 
     * @return An array of PropertyDescriptors describing the editable
     * properties supported by this bean.  May return null if the
     * information should be obtained by automatic analysis.
     * <p>
     * If a property is indexed, then its entry in the result array will
     * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor.
     * A client of getPropertyDescriptors can use "instanceof" to check
     * if a given PropertyDescriptor is an IndexedPropertyDescriptor.
     */
    @Override
    public PropertyDescriptor[] getPropertyDescriptors() {
	return getPdescriptor();
    }

    /**
     * Gets the bean's <code>EventSetDescriptor</code>s.
     * 
     * @return  An array of EventSetDescriptors describing the kinds of 
     * events fired by this bean.  May return null if the information
     * should be obtained by automatic analysis.
     */
    @Override
    public EventSetDescriptor[] getEventSetDescriptors() {
	return getEdescriptor();
    }

    /**
     * Gets the bean's <code>MethodDescriptor</code>s.
     * 
     * @return  An array of MethodDescriptors describing the methods 
     * implemented by this bean.  May return null if the information
     * should be obtained by automatic analysis.
     */
    @Override
    public MethodDescriptor[] getMethodDescriptors() {
	return getMdescriptor();
    }

    /**
     * A bean may have a "default" property that is the property that will
     * mostly commonly be initially chosen for update by human's who are 
     * customizing the bean.
     * @return  Index of default property in the PropertyDescriptor array
     * 		returned by getPropertyDescriptors.
     * <P>	Returns -1 if there is no default property.
     */
    @Override
    public int getDefaultPropertyIndex() {
        return defaultPropertyIndex;
    }

    /**
     * A bean may have a "default" event that is the event that will
     * mostly commonly be used by human's when using the bean. 
     * @return Index of default event in the EventSetDescriptor array
     *		returned by getEventSetDescriptors.
     * <P>	Returns -1 if there is no default event.
     */
    @Override
    public int getDefaultEventIndex() {
        return defaultEventIndex;
    }

    /**
     * This method returns an image object that can be used to
     * represent the bean in toolboxes, toolbars, etc.   Icon images
     * will typically be GIFs, but may in future include other formats.
     * <p>
     * Beans aren't required to provide icons and may return null from
     * this method.
     * <p>
     * There are four possible flavors of icons (16x16 color,
     * 32x32 color, 16x16 mono, 32x32 mono).  If a bean choses to only
     * support a single icon we recommend supporting 16x16 color.
     * <p>
     * We recommend that icons have a "transparent" background
     * so they can be rendered onto an existing background.
     *
     * @param  iconKind  The kind of icon requested.  This should be
     *    one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, 
     *    ICON_MONO_16x16, or ICON_MONO_32x32.
     * @return  An image object representing the requested icon.  May
     *    return null if no suitable icon is available.
     */
    @Override
    public java.awt.Image getIcon(int iconKind) {
        switch ( iconKind ) {
        case ICON_COLOR_16x16:
            if ( iconNameC16 == null )
                return null;
            else {
                if( iconColor16 == null )
                    iconColor16 = loadImage( iconNameC16 );
                return iconColor16;
            }
        case ICON_COLOR_32x32:
            if ( iconNameC32 == null )
                return null;
            else {
                if( iconColor32 == null )
                    iconColor32 = loadImage( iconNameC32 );
                return iconColor32;
            }
        case ICON_MONO_16x16:
            if ( iconNameM16 == null )
                return null;
            else {
                if( iconMono16 == null )
                    iconMono16 = loadImage( iconNameM16 );
                return iconMono16;
            }
        case ICON_MONO_32x32:
            if ( iconNameM32 == null )
                return null;
            else {
                if( iconMono32 == null )
                    iconMono32 = loadImage( iconNameM32 );
                return iconMono32;
            }
	default: return null;
        }
    }

}

